﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using PageNavigator;
using Parsowanie;
using Portfel.IS;
using Portfel.SerializeModels;
using Portfel.ViewModels;
using Portfel.enums;
using Telerik.Windows.Controls;
using Telerik.Windows.Data;

namespace Portfel
{
    public partial class MojePapiery : PhoneApplicationPage
    {



        public MojePapiery()
        {
            InitializeComponent();
            Loaded += MainPage_Loaded;
        }

        private void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            SetDataContext();
        }


        private void SetDataContext()
        {
        }

        private void ApplicationBarIconButton_Click(object sender, EventArgs e)
        {
            this.AktywaList.IsCheckModeActive ^= true;
        }
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            var newparameter = Navigator.Instance.GetData<Tuple<List<DataItemViewModel>, List<DataItemViewModel>>>(NavigationContext);
            if (newparameter != null)
                if (newparameter.Item1 != null)
                {
                    var contex = (MainAktywaViewModel)DataContext;
                    foreach (DataItemViewModel d in newparameter.Item1)
                    {
                        if (contex.Aktywas.All(aktywa => aktywa.Name != d.Title))
                            contex.Aktywas.Add(new Aktywa
                                                   {
                                                       Ilość = 0,
                                                       Name = d.Title,
                                                       Koszt = 0,//double.Parse(d.Kurs),
                                                       Typ = TypPapieru.Akcja,
                                                       IsNew = true
                                                   });
                    }
                    foreach (DataItemViewModel d in newparameter.Item2)
                    {
                        if (contex.Aktywas.All(aktywa => aktywa.Name != d.Title))
                            contex.Aktywas.Add(new Aktywa
                            {
                                Ilość = 0,
                                Name = d.Title,
                                Koszt = 0,//double.Parse(d.Kurs),
                                Typ = TypPapieru.Obligacja,
                                IsNew = true
                            });
                    }

                    contex.InitializeItems();
                }

        }

        protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)
        {
            base.OnNavigatingFrom(e);
            var context = ((MainAktywaViewModel)DataContext);
            foreach (var i in context.Aktywas)
            {
                i.IsNew = false;
            }
            Save();
        }

        private void Save()
        {
            var context = ((MainAktywaViewModel)DataContext);
            List<SecurityIndice> akcje = null;

            List<SecurityIndice> obligacje = null;

            foreach (var i in context.Items)
            {
                var aktywo = context.Aktywas.First(aktywa => aktywa.Name == i.Title);
                var aktIlość = (int)aktywo.Ilość;
                double zmienna;
                var vieIlość = double.TryParse(i.Ilość, out zmienna) ? (int)zmienna : 0;


                if (aktIlość != vieIlość)
                {
                    if (aktywo.Typ == TypPapieru.Obligacja)
                    {
                        if (obligacje == null) obligacje = IsolatedStorageHelper.ReadFromXml<List<SecurityIndice>>(IsolatedStorageHelper.ObligacjeFile);
                    }
                    else if (aktywo.Typ == TypPapieru.Akcja)
                    {
                        if (akcje == null) akcje = IsolatedStorageHelper.ReadFromXml<List<SecurityIndice>>(IsolatedStorageHelper.AkcjeFile);
                    }

                    var kurs = aktywo.Typ == TypPapieru.Akcja
                                   ? akcje.First(akcja => akcja.Security.SecurityName == aktywo.Name).Rate
                                   : obligacje.First(akcja => akcja.Security.SecurityName == aktywo.Name).Rate;
                    var róznica = vieIlość - aktIlość;
                    aktywo.Ilość = vieIlość;
                    aktywo.Koszt += róznica * kurs;
                }
            }
            IsolatedStorageHelper.WriteToXml(context.Aktywas, IsolatedStorageHelper.Aktywa);
        }

        private void GroupPickerItemTap(object sender, GroupPickerItemTapEventArgs e)
        {
            var jumplist = (RadJumpList)sender;
            foreach (DataGroup group in jumplist.Groups)
            {
                if (object.Equals(e.DataItem, group.Key))
                {
                    e.DataItemToNavigate = group;
                    return;
                }
            }
        }

        private void SaveButtonClick(object sender, EventArgs e)
        {

            var context = ((MainAktywaViewModel)DataContext);
            foreach (var aktywa in context.Aktywas)
            {
                aktywa.IsNew = false;
            }

            Save();
            context.InitializeItems();

        }

        private void EditClick(object sender, EventArgs e)
        {
            var items = AktywaList.CheckedItems.Cast<AktywaViewModel>();
            var context = ((MainAktywaViewModel)DataContext);
            foreach (var i in items)
            {
                var aktywo = context.Aktywas.First(aktywa => aktywa.Name == i.Title);
                aktywo.IsNew = true;
            }
            context.InitializeItems();
            Save();
            context.InitializeItems();
        }

        private void UsunClick(object sender, EventArgs e)
        {
            var items = AktywaList.CheckedItems.Cast<AktywaViewModel>();
            var context = ((MainAktywaViewModel)DataContext);

            var names = items.Select(model => model.Title);
            foreach (var name in names)
            {
                var item = context.Aktywas.First(it => it.Name == name);
                context.Aktywas.Remove(item);
            }
            context.InitializeItems();
            Save();
            context.InitializeItems();
        }
    }
}
